home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mtdir.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  11.5 KB  |  367 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE mtDir;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *-----------+----------+------+----------------------------------------*)
  29.  
  30.  
  31.  
  32. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  33. (*                                              *)
  34. (*$R-   Range-Checks                            *)
  35. (*$S-   Stack-Check                             *)
  36. (*                                              *)
  37. (*----------------------------------------------*)
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  45.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  46.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  47.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  48.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  49.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  50.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  51.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58. FROM SYSTEM       IMPORT  ADR, ADDRESS;
  59. FROM MagicStrings IMPORT  Append, Assign, Length, Copy, Equal, Insert, Pos;
  60.                   IMPORT  MagicAES, MagicVDI, MagicDOS, MagicTypes;
  61.                   IMPORT  XBRA, MagicCookie;
  62.  
  63. CONST   NullChar =      0C;
  64.  
  65. VAR     version:        sCARDINAL;
  66.         slash:          ARRAY [0..0] OF CHAR;
  67.         exselector:     BOOLEAN;
  68.         stack:          ADDRESS;
  69.  
  70. VAR     Search:         RECORD
  71.                          name:  ARRAY [0..255] OF CHAR;
  72.                          attr:  sBITSET;
  73.                          first: BOOLEAN;
  74.                          dta:   MagicDOS.PtrDTA;
  75.                         END; 
  76.  
  77. VAR     defDTA:         MagicDOS.DTA;
  78.         defDtaPtr:      MagicDOS.PtrDTA;
  79.  
  80.  
  81. PROCEDURE GetDir (VAR pfad, name: ARRAY OF CHAR; REF msg: ARRAY OF CHAR): BOOLEAN;
  82. VAR c: sCARDINAL;
  83.     m: ARRAY [0..30] OF CHAR;
  84.     b: BOOLEAN;
  85. BEGIN
  86.  GetPath (pfad);
  87.  IF exselector THEN
  88.   Assign (msg, m);  m[30]:= NullChar;
  89.   b:= MagicAES.FselExinput(m, pfad, name);
  90.  ELSE (* Normalen Selector verwenden *)
  91.   b:= MagicAES.FselInput (pfad, name);
  92.  END;
  93.  IF NOT b  THEN  Assign ('', name);  END;
  94.  RETURN b;
  95. END GetDir;
  96.  
  97. PROCEDURE GetFile (REF wild, message: ARRAY OF CHAR; VAR file: ARRAY OF CHAR): BOOLEAN;
  98. VAR p: ARRAY [0..255] OF CHAR;
  99.     n: ARRAY [0..15] OF CHAR;
  100. BEGIN
  101.  Assign (wild, p);  n:= '';
  102.  IF GetDir (p, n, message) THEN
  103.   Assign (p, file);  DelTail (file);  Append (n, file);
  104.   RETURN TRUE;
  105.  ELSE
  106.   RETURN FALSE;
  107.  END;
  108. END GetFile;
  109.  
  110. PROCEDURE GetPath (VAR pfad: ARRAY OF CHAR);
  111. VAR drive, c, d: sCARDINAL;
  112.     p, suff:     ARRAY [0..40] OF CHAR;
  113. BEGIN
  114.  IF (pfad[0] = NullChar) OR (pfad[0] = '*') THEN
  115.   c:= Length (pfad);
  116.   IF c > 0 THEN
  117.    DEC (c);
  118.    WHILE (c > 0) & (pfad[c] # '.') DO  DEC (c);  END;
  119.    IF c > 0 THEN
  120.     d:= c;
  121.     WHILE (pfad[c] # NullChar) DO
  122.      suff [c - d]:= pfad[c];  INC (c);
  123.     END (* WHILE *);
  124.     suff[c - d]:= NullChar;
  125.    END (* IF *);
  126.   ELSE
  127.    suff[0]:= NullChar;
  128.   END (* IF *);
  129.   drive:= MagicDOS.Dgetdrv ();
  130.   Assign ('', p);
  131.   pfad[0]:= CHR (ORD ('A') + drive);
  132.   pfad[1]:= ':';  pfad[2]:= NullChar;
  133.   MagicDOS.Dgetpath (p, drive + 1);
  134.   Append (p, pfad);
  135.   Append ('\*', pfad);
  136.   IF suff[0] # NullChar THEN
  137.    Append (suff, pfad)
  138.   ELSE
  139.    Append ('.*', pfad);
  140.   END (* IF kein alter Suffix *);
  141.  END (* IF pf leer *);
  142. END GetPath;
  143.  
  144. PROCEDURE DelTail (VAR s: ARRAY OF CHAR);
  145. VAR c: CARDINAL;
  146. BEGIN
  147.  c:= Length (s);
  148.  WHILE (c > 0) & (s [c - 1] # '\') DO
  149.   DEC (c);  s[c]:= NullChar;
  150.  END (* WHILE *);
  151. END DelTail;
  152.  
  153. PROCEDURE SplitPath (REF path: ARRAY OF CHAR; VAR pfad, name, suff: ARRAY OF CHAR);
  154. VAR c, d, len, pLen:  CARDINAL;
  155. BEGIN
  156.  len:= Length (path);
  157.  IF len = 0 THEN  RETURN;  END;
  158.  pfad[0]:= NullChar;
  159.  name[0]:= NullChar;
  160.  suff[0]:= NullChar;
  161.  c:= len;
  162.  
  163.  (* Suffix abspalten wenn vorhanden: *)
  164.  IF c > 0 THEN
  165.   DEC (c); (* Index des letzten Zeichens *)
  166.   WHILE (c > 0) & (path[c] # '.') DO  DEC (c);  END;
  167.   IF c > 0 THEN (* wir haben den Punkt gefunden *)
  168.    d:= 0;
  169.    INC (c);
  170.    WHILE (path[c] # NullChar) AND (d < 3) DO
  171.     suff[d]:= path[c];  INC (c);  INC (d);
  172.    END (* WHILE *);
  173.    IF d <= HIGH (suff) THEN  suff[d]:= NullChar  END;
  174.   END (* IF *);
  175.  ELSE
  176.   suff[0]:= NullChar
  177.  END (* IF *);
  178.   
  179.  c:= len;
  180.  IF c > 0 THEN DEC (c); END;
  181.  
  182.  (* Dateinamen abspalten: *)
  183.  WHILE (c > 0) & (path[c] # '\') & (path[c] # ':') DO  DEC (c);  END;
  184.  IF (path[c] = '\') OR (path[c] = ':') THEN INC (c); END;
  185.  pLen:= c;
  186.  d:= 0;
  187.  FOR c:= c TO len - 1 DO  name[d]:= path[c];  INC (d);  END;
  188.  IF d <= HIGH (name) THEN  name[d]:= NullChar;  END;
  189.  
  190.  (* Pfad kopieren: *)
  191.  IF pLen > 0 THEN
  192.   FOR d:= 0 TO pLen - 1 DO  pfad[d]:= path[d];  END;
  193.  END (* IF *);
  194.  pfad[pLen]:= NullChar;
  195.  
  196. END SplitPath;
  197.  
  198. PROCEDURE CompletePath (VAR pfad: ARRAY OF CHAR; REF standard: ARRAY OF CHAR);
  199. VAR drv, old: sCARDINAL;
  200.     dummy:    lBITSET;
  201.     drvStr:   ARRAY [0..1] OF CHAR;
  202.     path:     ARRAY [0..255] OF CHAR;
  203. BEGIN
  204.  IF pfad[0] = NullChar THEN 
  205.   (* Pfad leer, dann Standard-Pfad verwenden *)
  206.   Assign (standard, pfad)
  207.  ELSIF pfad[0] = '\' THEN 
  208.   (* Root-Dir des aktuellen Laufwerks verwenden *)
  209.   drvStr:= ' :';
  210.   drv:= MagicDOS.Dgetdrv ();
  211.   drvStr[0]:= CHR (drv + 65);
  212.   Insert (drvStr, pfad, 0);
  213.  ELSIF pfad[1] = ':' THEN
  214.   (* Laufwerksbezeichner im Pfad *)
  215.   IF pfad[2] # '\' THEN (* Standardpfad des Laufwerks verwenden *)
  216.    old:= MagicDOS.Dgetdrv ();
  217.    drv:= ORD (pfad[0]) - 65;  
  218.    MagicDOS.Dsetdrv (drv, dummy);
  219.    MagicDOS.Dgetpath (path, 0);
  220.    MagicDOS.Dsetdrv (old, dummy);
  221.    drvStr[0]:= pfad[0];
  222.    drvStr[1]:= pfad[1];
  223.    Insert (drvStr, path, 0);
  224.    Assign (path, pfad);
  225.    Append (slash, pfad);
  226.   END; 
  227.  ELSIF Pos (slash, pfad, 0, FALSE) < HIGH (pfad) THEN
  228.   Insert (standard, pfad, 0);
  229.  END;  
  230. END CompletePath;
  231.  
  232. PROCEDURE GetVersion (): sCARDINAL;
  233. BEGIN
  234.  RETURN version;
  235. END GetVersion;
  236.  
  237. PROCEDURE ExSelector (): BOOLEAN;
  238. BEGIN
  239.  RETURN exselector;
  240. END ExSelector;
  241.  
  242. PROCEDURE SearchParas (REF maske: ARRAY OF CHAR; attribut: sBITSET;
  243.                        ptr: MagicDOS.PtrDTA; firsttime: BOOLEAN);
  244. BEGIN
  245.  WITH Search DO
  246.   Assign (maske, name);
  247.   attr:= attribut;
  248.   first:= firsttime;
  249.   dta:= ptr;
  250.  END;   
  251. END SearchParas;
  252.  
  253. PROCEDURE Found (): BOOLEAN;
  254. VAR err: sINTEGER;
  255. BEGIN
  256.  MagicDOS.Fsetdta (Search.dta);
  257.  IF Search.first THEN
  258.   err:= MagicDOS.Fsfirst (Search.name, Search.attr);
  259.   Search.first:= FALSE;
  260.  ELSE
  261.   err:= MagicDOS.Fsnext ();
  262.  END;
  263.  RETURN (err = 0);
  264. END Found;
  265.  
  266. PROCEDURE Exist (REF datei: ARRAY OF CHAR): BOOLEAN;
  267. (* Testet, ob Datei oder Ordner schon existiert *)
  268. VAR err: sINTEGER;
  269. BEGIN
  270.  MagicDOS.Fsetdta (defDtaPtr);
  271.  RETURN MagicDOS.Fsfirst (datei, {0..15}) = 0;
  272. END Exist;
  273.  
  274. PROCEDURE Replace (REF oldName, wildcard: ARRAY OF CHAR; VAR new: ARRAY OF CHAR);
  275. (* Bildet aus wildcard und oldName einen neuen Dateinamen (new). *)
  276. CONST cMaxLen =  11;
  277.       cPrefLen =  8;
  278.  
  279.  PROCEDURE MakeMask (REF wild: ARRAY OF CHAR; VAR maske: ARRAY OF CHAR);
  280.  (* Expandiert einen Dateinamen auf 12 Zeichen, ? und * werden als ?
  281.   * eingetragen. Nichtvorhandene Zeichen werden Blanks!
  282.   *)
  283.  VAR c, d, i:   CARDINAL;
  284.  BEGIN (* MachMaske *)
  285.   c:= 0;  d:= 0;  Assign ("????????????", maske); (* Vorgefertigte Maske *)
  286.   LOOP 
  287.    IF (wild[d] = CHR(0)) OR (d > HIGH(wild)) THEN
  288.     (* Wildcard zu Ende, Rest der Maske mit Blanks auffllen *)
  289.     FOR i:= c TO cMaxLen DO maske[i]:= " "; END;
  290.     RETURN;
  291.    ELSIF (wild[d] = "*") THEN
  292.     (* Auf einen * muž ein Punkt in der Wildcard folgen! *E*.MOD ist illegal! *)
  293.     INC(d, 2); (* Punkt auslassen *)
  294.     EXIT; (* Fertig mit Prefix-Teil *)
  295.    ELSIF (wild[d] = ".") THEN
  296.     (* Punkt gefunden, Prefix bis zur Maximalen L„nge mit Blanks auffllen *)
  297.     FOR i:= c TO cPrefLen DO  maske[i]:= " ";  END; 
  298.     INC(d);
  299.     EXIT; (* Fertig mit Prefix-Teil *)
  300.    ELSE (* Zeichen aus wild nach maske bertragen *)
  301.     maske[c]:= wild[d];  INC(c);  INC(d);
  302.    END;
  303.   END;
  304.   c:= cPrefLen + 1; (* Index von maske auf "nach dem Punkt" einstellen *)
  305.   LOOP
  306.    IF (wild[d] = CHR(0)) OR (d > HIGH(wild)) THEN
  307.     (* Wildcard zu Ende, Rest der Maske mit Blanks auffllen *)
  308.     FOR i:= c TO cMaxLen DO maske[i]:= " "; END;
  309.     RETURN;
  310.    END;
  311.    IF (c > cMaxLen) OR (wild[d]="*") THEN 
  312.     EXIT (* wild fertig, bzw. maske voll *)
  313.    END;
  314.    (* Zeichen aus wild nach maske bertragen *)
  315.    maske[c]:= wild[d];  INC(c); INC(d); 
  316.   END;
  317.  END MakeMask;
  318.  
  319.  
  320. VAR c, d: sCARDINAL;
  321.     wild, maske: ARRAY [0..11] OF CHAR;
  322.  
  323. BEGIN (* Ersetze *)
  324.  MakeMask (wildcard, wild); (* Masken erstellen *)
  325.  MakeMask (oldName, maske);
  326.  (* Alle legalen Zeichen aus wild nach maske bertragen (auch Blanks!) *)
  327.  FOR c:= 0 TO cMaxLen DO
  328.   IF wild[c] # "?" THEN maske[c]:= wild[c] END;
  329.  END;
  330.  (* new zur Sicherheit l”schen *)
  331.  FOR c:= 0 TO cMaxLen DO new[c]:= CHR(0);  END;
  332.  c:= 0;  d:= 0;
  333.  LOOP
  334.   IF (d > cMaxLen) THEN EXIT END; (* Neuer Name fertig *)
  335.   IF d = cPrefLen THEN (* Punktposition, Punkt in new einsetzen *)
  336.    new[c]:= ".";  INC(c);  INC(d); 
  337.   END;
  338.   IF (maske[d] # "?") AND (maske[d] # " ") THEN  
  339.    (* Blanks und ? aussparen, haben nix im neuen Namen zu suchen! *)
  340.    new[c]:= maske[d];  INC(c); INC(d);
  341.   ELSE
  342.    INC(d);
  343.   END;
  344.  END;
  345.  IF c < HIGH (new) THEN new[c]:= NullChar;  END;
  346. END Replace;
  347.  
  348. CONST   GEMtrap = 88H;
  349.         Kennung = 'FSmp';
  350.  
  351. VAR     c:      sCARDINAL;
  352.         adr:    ADDRESS;
  353.         val:    lWORD;
  354.  
  355. BEGIN
  356.  slash[0]:= '\';
  357.  exselector:= FALSE;
  358.  defDtaPtr:= ADR(defDTA);
  359.  exselector:= MagicCookie.FindCookie ('FSEL', val);
  360.  IF NOT exselector THEN
  361.   exselector:= XBRA.Installed (Kennung, GEMtrap, adr);
  362.  END;
  363.  version:= TosVersion();
  364.  IF NOT exselector THEN  exselector:= version > Tos102;  END;
  365. END mtDir.
  366.  
  367.